<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // function person(name, age) {
    //   this.name = name
    //   this.age = age
    //   return [1]
    // }
    // person.prototype.do = function () {
    //   console.log("打游戏");
    // }
    // // 手写new函数
    // function myNew(constr, ...arg) {
    //   // 1创建一个对象
    //   const obj = {}
    //   // 2使用apply修改构造函数this为我们创建的对象
    //   const re = constr.apply(obj, arg)
    //   // 3把obj的隐士原型指向构造函数的原型对象
    //   obj.__proto__ = constr.prototype
    //   //4.返回值(判断构造函数的返回值是基本类型还是引用类型)
    //   if (typeof re === "object" && re !== null || typeof re === "function") {
    //     return re
    //   } else {
    //     return obj
    //   }

    // }

    // const p1 = myNew(person, "laoliu", 18)
    // console.log(p1, "p1");



    // 定义构造函数
    // const person = function (name, age) {
    //   this.name = name
    //   this.age = age
    //   return [1]
    // }
    // person.prototype.do = function () {
    //   console.log("打游戏");
    // }
    // // 定义模拟new函数
    // const myNew = function (constr, ...arg) {
    //   // 1申明一个对象模拟实例化对象
    //   const obj = {}
    //   // 2修改this指向为这个对象
    //   const re = constr.apply(obj, arg)
    //   // 3修改prototype
    //   obj.__proto__ = constr.prototype
    //   // 4返回值
    //   if (typeof re === "object" && re !== null || typeof re === "function") {
    //     return re
    //   } else {
    //     return obj
    //   }
    // }

    // const p1 = myNew(person, "laoliu", 18)
    // console.log("p1", p1);

    // function person(name, age) {
    //   this.name = name
    //   this.age = age
    //   return [1]
    // }
    // person.prototype.do = function () {
    //   console.log("打游戏");
    // }

    // function myNew(constr, ...arg) {
    //   const obj = {}
    //   obj.__proto__ = constr.prototype
    //   const re = constr.apply(obj, arg)
    //   if (typeof re === "object" && re !== null || typeof re === "function") {
    //     return re
    //   } else {
    //     return obj
    //   }
    // }

    // const p1 = myNew(person, "laoliu", 18)
    // console.log("p1", p1);

    function person(name, age) {
      this.name = name
      this.age = age
      return [1]
    }
    person.prototype.do = function () {
      console.log("打游戏");
    }

    function mynew(constor, ...arg) {
      const obj = {}
      const re = constor.apply(obj, arg)
      obj.__proto__ = constor.prototype
      if (typeof re === "object" && re !== null || typeof re === "function") {
        return re
      } else {
        return obj
      }
    }
    const p1 = mynew(person, "laojiu", 18)
    console.log("p1", p1)



    // 
  </script>
</body>

</html>